#include <string.h>
#include <iostream>

using std::cout;
using std::endl;

//通用版本
template <class T>
T add(T x, T y)
{
    cout << "T add(T,T)" << endl;
    return x + y;
}

//模板的特化(specialization)
//1. 全特化(所有的类型参数全部指定)
//2. 偏特化(部分类型参数被指定)
template <>
const char * add<const char *>(const char *px, const char * py)
{
    char * ptmp = new char[strlen(px) + strlen(py) + 1]();
    strcpy(ptmp, px);
    strcat(ptmp, py);
    return ptmp;
}


int main()
{
    int i1 = 1, i2 = 2;
    double d1 = 1.1, d2 = 2.2;
    float f1 = 3.3f, f2 = 4.4f;
    const char * ps1 = "hello";
    const char * ps2 = "world";

    //根据实际调用时，传递的参数类型来自动进行推导
    //在实际调用时，没有加上模板参数列表称为隐式实例化
    cout << "add(i1, i2):" << add(i1, i2) << endl;
    cout << "add(d1, d2):" << add(d1, d2) << endl;
    cout << "add(f1, f2):" << add(f1, f2) << endl;
    //在实际调用时，加上模板参数列表的，称为显式实例化
    cout << "add(i1, d1):" << add<double>(i1, d1) << endl;
    cout << "add(ps1, ps2):" << add(ps1, ps2) << endl;

    return 0;
}

